#ifndef BITMAP_H
#define BITMAP_H


typedef unsigned char  BYTE1;
typedef unsigned short BYTE2;
typedef unsigned int   BYTE4;

#pragma pack(push)
#pragma pack(1)
typedef struct BitmapFileHeader {
    BYTE2 bfType;
    BYTE4 bfSize;
    BYTE2 bfReserved1;
    BYTE2 bfReserved2;
    BYTE4 bfOffBits;
} BitmapFileHeader;

typedef struct BitmapInfoHeader {
    BYTE4 biSize;
    BYTE4 biWidth;
    BYTE4 biHeight;
    BYTE2 biPlanes;
    BYTE2 biBitsPerPixel;
    BYTE4 biCompression;
    BYTE4 biImageSize;
    BYTE4 biXPixelsPerMeter;
    BYTE4 biYPixelsPerMeter;
    BYTE4 biClrUsed;
    BYTE4 biClrImportant;
} BitmapInfoHeader;


typedef struct BitmapHeader {
    BitmapFileHeader file_header;
    BitmapInfoHeader info_header;
} BitmapHeader;


typedef struct Bitmap {
	BitmapHeader *header;
    int xres; //图像数据横向字节数
    int yres; //图像数据竖向字节数
    int bits_per_pixel; //每个像素的位数
    int extra; //当横向字节不是4的整数倍时，保存填充的字节数
    void* data; //指向图像数据的起始位置
} Bitmap;

/*
 * 从filename读取信息，创建一个位图对象
 */
int bitmap_init(Bitmap* bitmap, char* filename);


/*
 * 销毁这个位图
 */
void bitmap_destroy(Bitmap* bitmap);

/*
 * print out header info
 */
void bitmap_info(Bitmap* bitmap);

#pragma pack(pop)

void print_file_header(BitmapFileHeader* header);
void print_info_header(BitmapInfoHeader* header);

#endif // BITMAP_H
